import os
import subprocess

from video_base import VideoBase


class VideoMerge(VideoBase):
    def __init__(self,
                 video_dir: str,
                 audio_name: str,
                 video_name: str,
                 output_name: str = "video.mp4"):
        """
        input_video: 输入视频路径
        audio_name: 输出音频文件名
        video_name: 输出视频文件名
        output_name: 合并输出视频名
        """
        self.video_dir = video_dir
        self.audio_path = str(os.path.join(self.video_dir, audio_name))
        self.video_path = str(os.path.join(self.video_dir, video_name))
        self.output_name = output_name
        super().__init__(self.video_path)

    def run(self):
        start_time = 0
        print(f"合成音频: {self.output_name}, start={start_time}, duration={self.duration}")
        cmd = [
            self.ffmpeg_exe,  # FFmpeg 可执行文件路径
            "-ss", str(start_time),  # 从音频源的 start_time 秒开始
            "-y",  # 如果输出文件已存在，自动覆盖
            "-i", self.video_path,  # 输入视频流（无音频的视频）
            "-i", self.audio_path,  # 输入音频源（原视频）
            "-t", str(self.duration),  # 截取长度 duration 秒
            "-map", "0:v",  # 使用第一个输入（temp_video）的 **视频流**
            "-map", "1:a",  # 使用第二个输入（原视频）的 **音频流**
            "-c:v", "libx264",  # 视频流直接拷贝，不重新编码
            "-preset", "fast",
            "-crf", "23",
            "-c:a", "aac",  # 音频流编码为 AAC（保证兼容性）
            self.output_name  # 输出文件名
        ]
        print(f"合并命令：{' '.join(cmd)}")
        subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)


# ---------------- 使用示例 ----------------
if __name__ == "__main__":
    video_manager = VideoMerge(
        video_dir="D:\视频文件",
        audio_name="音频.mp4",
        video_name="视频.mp4"
    )
    video_manager.run()
